import { debug, speedOnly } from "./buildConfig.mts";
import { data } from "./globalData.mts";
import { defaultValues, values } from "./gmBridge.mts";
import { logger } from "./logger.mts";
import type { BRule } from "./types.d.mts";
import { bRuleParser } from "./util.mts";

/**
 * 处理所有 BRule 对象，统计得出应用级别
 *
 * 应用级别：
 *
 * 0 应用所有规则
 *
 * 1 只应用特定规则
 *
 * 2 只应用通用规则
 *
 * 3 禁用所有规则
 * @async
 * @returns {Promise.<number>} 应用级别
 */
export async function parseBRules(): Promise<BRule["level"]> {
  data.appliedLevel = 0;
  const brules = (await values.brules()) ?? defaultValues.brules;
  for (const br of brules) {
    const level = bRuleParser(br);
    if (level > 0) {
      data.bRules.push(br);
      if (level !== data.appliedLevel) {
        data.appliedLevel = data.appliedLevel === 0 ? level : 3;
      }
    }
  }
  if (debug && !speedOnly) {
    logger("data", {
      bLevels: data.appliedLevel,
      bRules: data.bRules.length,
    });
  }
  return data.appliedLevel;
}

/**
 * 根据 CSS 容器编号和应用级别，计算是否应用 CSS
 *
 * CSS 容器编号：
 *
 * 0 通用标准 CSS 规则
 *
 * 1 通用扩充 CSS 规则
 *
 * 2 特定标准 CSS 规则
 *
 * 3 特定扩充 CSS 规则
 * @param {number} type CSS 容器编号
 * @returns {boolean} 是否应用 CSS
 */
export function canApplyCss(type: 0 | 1 | 2 | 3): boolean {
  return (data.appliedLevel & (type >= 2 ? 2 : 1)) == 0;
}
